home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / cc02.zip / CPC.C < prev    next >
Text File  |  1985-08-05  |  49KB  |  2,503 lines

  1. /* ### cpcn-1 */
  2. /************************************************/
  3. /*                        */
  4. /*        small-c:PC compiler        */
  5. /*                        */
  6. /*          by Ron Cain            */
  7. /*    modified by CAPROCK SYSTEMS for IBM PC    */
  8. /*                        */
  9. /************************************************/
  10.  
  11.  
  12. #define BANNER  "* * *  Small-C:PC  V1.1  * * *"
  13.  
  14.  
  15. #define VERSION "PC-DOS Version N: June, 1982"
  16.  
  17.  
  18. #define AUTHOR "By Ron Cain, Modified by CAPROCK SYSTEMS for IBM PC"
  19.  
  20.  
  21. /*    Define system dependent parameters    */
  22.  
  23.  
  24. /*    Stand-alone definitions            */
  25.  
  26.  
  27. #define NULL 0
  28. #define eol 13
  29.  
  30.  
  31. /*    UNIX definitions (if not stand-alone)    */
  32.  
  33.  
  34. /* #include <stdio.h>    */
  35. /* #define eol 10    */
  36.  
  37.  
  38. /*    Define the symbol table parameters    */
  39.  
  40.  
  41. #define    symsiz    14
  42. #define    symtbsz    5040
  43. #define numglbs 300
  44. #define    startglb symtab
  45. #define    endglb    startglb+numglbs*symsiz
  46. #define    startloc endglb+symsiz
  47. #define    endloc    symtab+symtbsz-symsiz
  48.  
  49.  
  50. /*    Define symbol table entry format    */
  51.  
  52.  
  53. #define    name    0
  54. #define    ident    9
  55. #define    type    10
  56. #define    storage    11
  57. #define    offset    12
  58.  
  59.  
  60. /*    System wide name size (for symbols)    */
  61.  
  62.  
  63. #define    namesize 9
  64. #define namemax  8
  65.  
  66.  
  67. /*    Define data for external symbols    */
  68.  
  69. #define extblsz 2000
  70. #define startextrn exttab
  71. #define endextrn exttab+extblsz-namesize-1
  72.  
  73. /* Possible types of exttab entries */
  74. /* Stored in the byte following zero terminating the name */
  75.  
  76. #define rtsfunc 1
  77. #define userfunc 2
  78. #define statref 3
  79.  
  80.  
  81. /*    Define possible entries for "ident"    */
  82.  
  83.  
  84. #define    variable 1
  85. #define    array    2
  86. #define    pointer    3
  87. #define    function 4
  88.  
  89.  
  90. /*    Define possible entries for "type"    */
  91.  
  92.  
  93. #define    cchar    1
  94. #define    cint    2
  95.  
  96.  
  97. /*    Define possible entries for "storage"    */
  98.  
  99.  
  100. #define    statik    1
  101. #define    stkloc    2
  102.  
  103.  
  104. /*    Define the "while" statement queue    */
  105.  
  106.  
  107. #define    wqtabsz    100
  108. #define    wqsiz    4
  109. #define    wqmax    wq+wqtabsz-wqsiz
  110.  
  111.  
  112. /*    Define entry offsets in while queue    */
  113.  
  114.  
  115. #define    wqsym    0
  116. #define    wqsp    1
  117. #define    wqloop    2
  118. #define    wqlab    3
  119.  
  120.  
  121. /*    Define the literal pool            */
  122.  
  123.  
  124. #define    litabsz    3000
  125. #define    litmax    litabsz-1
  126.  
  127.  
  128. /*    Define the input line            */
  129.  
  130.  
  131. #define    linesize 80
  132. #define    linemax    linesize-1
  133. #define    mpmax    linemax
  134.  
  135.  
  136. /*    Define the macro (define) pool        */
  137.  
  138.  
  139. #define    macqsize 1000
  140. #define    macmax    macqsize-1
  141.  
  142.  
  143. /*    Define statement types (tokens)        */
  144.  
  145.  
  146. #define    stif    1
  147. #define    stwhile    2
  148. #define    streturn 3
  149. #define    stbreak    4
  150. #define    stcont    5
  151. #define    stasm    6
  152. #define    stexp    7
  153.  
  154.  
  155. /* Define how to carve up a name too long for the assembler */
  156.  
  157.  
  158. #define asmpref    7
  159. #define asmsuff    7
  160.  
  161.  
  162. /*    Now reserve some storage words        */
  163.  
  164.  
  165. char    exttab[extblsz];    /* external symbols */
  166. char    *extptr;        /* pointer to next available entry */
  167.  
  168.  
  169. char    symtab[symtbsz];    /* symbol table */
  170. char    *glbptr,*locptr;        /* ptrs to next entries */
  171.  
  172.  
  173. int    wq[wqtabsz];        /* while queue */
  174. int    *wqptr;            /* ptr to next entry */
  175.  
  176.  
  177. char    litq[litabsz];        /* literal pool */
  178. int    litptr;            /* ptr to next entry */
  179.  
  180.  
  181. char    macq[macqsize];        /* macro string buffer */
  182. int    macptr;            /* and its index */
  183.  
  184.  
  185. char    line[linesize];        /* parsing buffer */
  186. char    mline[linesize];    /* temp macro buffer */
  187. int    lptr,mptr;        /* ptrs into each */
  188.  
  189.  
  190. /*    Misc storage    */
  191.  
  192.  
  193. int    nxtlab,        /* next avail label # */
  194.     litlab,        /* label # assigned to literal pool */
  195.     cextern,    /* collecting external names flag */
  196.     Zsp,        /* compiler relative stk ptr */
  197.     argstk,        /* function arg sp */
  198.     ncmp,        /* # open compound statements */
  199.     errcnt,        /* # errors in compilation */
  200.     errstop,    /* stop on error            gtf 7/17/80 */
  201.     eof,        /* set non-zero on final input eof */
  202.     input,        /* iob # for input file */
  203.     output,        /* iob # for output file (if any) */
  204.     input2,        /* iob # for "include" file */
  205.     ctext,        /* non-zero to intermix c-source */
  206.     cmode,        /* non-zero while parsing c-code */
  207.             /* zero when passing assembly code */
  208.     lastst,        /* last executed statement type */
  209.     saveout,    /* holds output ptr when diverted to console       */
  210.             /*                    gtf 7/16/80 */
  211.     fnstart,    /* line# of start of current fn.    gtf 7/2/80 */
  212.     lineno,        /* line# in current file        gtf 7/2/80 */
  213.     infunc,        /* "inside function" flag        gtf 7/2/80 */
  214.     savestart,    /* copy of fnstart "    "        gtf 7/16/80 */
  215.     saveline,    /* copy of lineno  "    "        gtf 7/16/80 */
  216.     saveinfn;    /* copy of infunc  "    "        gtf 7/16/80 */
  217.  
  218.  
  219. char   *currfn,        /* ptr to symtab entry for current fn.    gtf 7/17/80 */
  220.        *savecurr;    /* copy of currfn for #include        gtf 7/17/80 */
  221. char    quote[2];    /* literal string for '"' */
  222. char    *cptr;        /* work ptr to any char buffer */
  223. int    *iptr;        /* work ptr to any int buffer */
  224. /*    >>>>> start cc1 <<<<<<        */
  225.  
  226.  
  227. /*                    */
  228. /*    Compiler begins execution here    */
  229. /*                    */
  230. main()
  231. {
  232.     hello();    /* greet user */
  233.     see();        /* determine options */
  234.     litlab=1;
  235.     openin();    /* first file to process */
  236.     while (input!=0)    /* process user files till he quits */
  237.         {
  238.         extptr=startextrn;    /* clear external symbols */
  239.         glbptr=startglb;    /* clear global symbols */
  240.         locptr=startloc;    /* clear local symbols */
  241.         wqptr=wq;        /* clear while queue */
  242.         macptr=        /* clear the macro pool */
  243.         litptr=        /* clear literal pool */
  244.           Zsp =        /* stack ptr (relative) */
  245.         errcnt=        /* no errors */
  246.         eof=        /* not end-of-file yet */
  247.         input2=        /* no include file */
  248.         saveout=    /* no diverted output */
  249.         ncmp=        /* no open compound states */
  250.         lastst=        /* no last statement yet */
  251.         cextern=    /* no externs yet */
  252.         fnstart=    /* current "function" started at line 0 gtf 7/2/80 */
  253.         lineno=        /* no lines read from file        gtf 7/2/80 */
  254.         infunc=        /* not in function now            gtf 7/2/80 */
  255.         quote[1]=
  256.         0;        /*  ...all set to zero.... */
  257.         quote[0]='"';        /* fake a quote literal */
  258.         currfn=NULL;    /* no function yet            gtf 7/2/80 */
  259.         cmode=nxtlab=1;    /* enable preprocessing and reset label numbers */
  260.         openout();
  261.         header();
  262.         parse();
  263.         if (ncmp) error("missing closing bracket");
  264.         extdump();
  265.         dumpublics();
  266.         trailer();
  267.         closeout();
  268.         errorsummary();
  269.         openin();
  270.         }
  271. }
  272. /* ### cpcn-2 */
  273. /*                    */
  274. /*    Abort compilation        */
  275. /*        gtf 7/17/80        */
  276. abort()
  277. {
  278.     if(input2)
  279.         endinclude();
  280.     if(input)
  281.         fclose(input);
  282.     closeout();
  283.     toconsole();
  284.     pl("Compilation aborted.");  nl();
  285.     exit();
  286. /* end abort */}
  287.  
  288.  
  289. /*                    */
  290. /*    Process all input text        */
  291. /*                    */
  292. /* At this level, only static declarations, */
  293. /*    defines, includes, and function */
  294. /*    definitions are legal...    */
  295. parse()
  296.     {
  297.     while (eof==0)        /* do until no more input */
  298.         {
  299.         if(amatch("extern",6)) {
  300.             cextern=1;
  301.             if(amatch("char",4)) {declglb(cchar);ns();}
  302.             else if(amatch("int",3)) {declglb(cint);ns();}
  303.             else {declglb(cint);ns();}
  304.             cextern=0;
  305.             }
  306.         else if(amatch("char",4)){declglb(cchar);ns();}
  307.         else if(amatch("int",3)){declglb(cint);ns();}
  308.         else if(match("#asm"))doasm();
  309.         else if(match("#include"))doinclude();
  310.         else if(match("#define"))addmac();
  311.         else newfunc();
  312.         blanks();    /* force eof if pending */
  313.         }
  314.     }
  315. /* ### cpcn-3 */
  316. dumpublics()
  317.     {
  318.     outstr("DUMMY SEGMENT BYTE STACK 'dummy'");nl();
  319.     outstr("DUMMY ENDS");nl();
  320.     outstr("STACK SEGMENT BYTE PUBLIC 'stack'");nl();
  321.     dumplits();
  322.     dumpglbs();
  323.     outstr("STACK ENDS");nl();
  324.     }
  325.  
  326. extdump()
  327.     {
  328.     char *ptrext;
  329.     ptrext=startextrn;
  330.     while(ptrext<extptr)
  331.         {
  332.         if((cptr=findglb(ptrext))!=0)
  333.             {if(cptr[ident]==function)
  334.                 if(cptr[offset]!=function) outextrn(ptrext);
  335.             }
  336.         else outextrn(ptrext);
  337.         ptrext=ptrext+strlen(ptrext)+2;
  338.         }
  339.     outstr("CSEG ENDS");nl();
  340.     }
  341. /* ### cpcn-4 */
  342. outextrn(ptr)
  343.     char *ptr;
  344.     {
  345.     char *functype;
  346.     functype=ptr+strlen(ptr)+1;
  347.     if(*functype==statref) return;
  348.     ot("EXTRN ");
  349.     if(*functype==rtsfunc) outasm(ptr);
  350.     else outname(ptr);
  351.     col();outstr("NEAR");nl();
  352.     }
  353.  
  354.  
  355. /*                    */
  356. /*    Dump the literal pool        */
  357. /*                    */
  358. dumplits()
  359.     {int j,k;
  360.     if (litptr==0) return;    /* if nothing there, exit...*/
  361.     printlabel(litlab); /* print literal label */
  362.     k=0;            /* init an index... */
  363.     while (k<litptr)    /*     to loop with */
  364.         {defbyte();    /* pseudo-op to define byte */
  365.         j=10;        /* max bytes per line */
  366.         while(j--)
  367.             {outdec((litq[k++]&127));
  368.             if ((j==0) | (k>=litptr))
  369.                 {nl();        /* need <cr> */
  370.                 break;
  371.                 }
  372.             outbyte(',');    /* s